#ifndef BUREAUCRAT_H_
#define BUREAUCRAT_H_

#include <boost/shared_ptr.hpp>
#include <vector>

class Course;
class Schedule;

/// Implements course sequence generation.  The Bureaucrat loads a curriculum
/// from the CourseFactory and generates a sequence of courses that respect
/// course dependencies and requirements.
class Bureaucrat {
    static Bureaucrat* instance_;     // the instance
	boost::shared_ptr<struct BureaucratImpl> pimpl_;

public:
	~Bureaucrat();

    std::vector<Schedule> schedules() const;
    static Bureaucrat* instance();

// Helper functions
private:
	// private to prohibit direct instantiation, initialization, assignment
	Bureaucrat();
	Bureaucrat(const Bureaucrat&);
	Bureaucrat& operator=(const Bureaucrat&);
	std::vector<Course> sequence() const;
};

#endif
